// 简答题
/**
 * 一、谈谈你是如何理解js异步编程的，EventLoop、消息队列都是做什么的，什么是宏任务，什么是微任务？
 * 
 * js异步就是把一个任务分为两段，先执行一段，然后在执行其他任务排在异步任务后面段代码不用等待异步任务结束之后运行，因为异步任务不会堵塞加载。
 * 
 * EventLoop 它会持续不断地检查调用栈是否为空，如果为空的话就检查消息队列是否有待处理的消息，如果有的话就从消息队列的队首取出一条消息并执行消息绑定的函数，如果没有就同步监控消息队列是否有新消息加入，一旦发现就立即取出并执行消息绑定的函数，整个过程不断重复。
 * EventLoop 执行顺序
 *  1、执行同步代码，这属于宏任务
 *  2、执行栈为空，查询是否有微任务需要执行
 *  3、执行所有微任务
 *  4、必要的话渲染 UI
 *  5、然后开始下一轮 EventLoop ，执行宏任务中的异步代码
 * 
 * 宏任务称为jobs 微任务称为task
 * 宏任务包括 script，setTimeout，setInterval，setImmediate，I/O UI rendering
 * 微任务包括 process.nextTick，promise，Object.observe， MutationObserver
 * 浏览器会先执行一个宏任务（宏任务中包括了script）接下来有异步代码的话先执行微任务
 */


// 将下面异步代码使用Promise的方法改进
/* setTimeout(function(){
  var a = 'hello'
  setTimeout(function(){
    var b = 'lagou'
    setTimeout(function(){
      var c = 'I ❤️ U'
      console.log(a + b + c);
    },10)
  },10)
},10) */
const p1 = new Promise((resolve, reject) => {
  let a = 'hello';
  setTimeout(resolve(a), 10)
})
const p2 = new Promise((resolve, reject) => {
  let b = 'lagou';
  setTimeout(resolve(b), 10)
})
const p3 = new Promise((resolve, reject) => {
  let c = 'I ❤️ U';
  setTimeout(resolve(c), 10)
})
Promise.all([p1, p2, p3]).then(result => {
  console.log(result.join(' '));
})
